package thefirst.controller;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;



import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import thefirst.addresscode.model.AddressCodeService;
import thefirst.addresscode.model.AddressCodeVO;
import thefirst.code.model.CodeVO;
import thefirst.member.model.MemberSearchVO;
import thefirst.member.model.MemberService;
import thefirst.member.model.MemberVO;
import thefirst.member.model.MemberListVO;
import thefirst.member.model.MyHelpVO;
import thefirst.member.model.StudentListVO;
import thefirst.member.model.StudentVO;
import thefirst.member.model.TeacherVO;
import thefirst.support.model.HelpService;

@Controller
public class MemberController extends MultiActionController {
	private String path="C:\\java-kosta\\workspace\\spring\\whereismyteacher-b0.01\\WebContent\\upload\\";
	@Resource(name="memberServiceImpl")
	private MemberService memberService;
	private AddressCodeService addressCodeService;
	@Resource(name="helpServiceImpl")
	private HelpService helpService;
	
///////////////////////////   경덕   ///////////////////////////////////////

	// registerStudentStart.do : header.jsp의 경로에서 넘어옴 
		// tiles 에서 학생 회원가입 view를 보여주는 페이지
		@RequestMapping("/registerStudentStart.do")		
		private String registerStudentStart() throws SQLException {
			System.out.println("registerStudentStart"); 
			return "student.member";
		}
		// casting : teacher와 student에서 student로 분류, student_Register.jsp에서 넘어오는 페이지
		@RequestMapping("/castingStudent.do")
		private String castingStudent(StudentVO svo) throws SQLException {
			System.out.println("castingStudent"+svo);
			// registerMember를 호출
			registerMember(svo);
			System.out.println("castingStudent");
			// studentRegister_result.jsp 경로
			return "student.result";
		}
		// registerTeacherStart.do : header.jsp의 경로에서 넘어옴 
		// tiles 에서 선생님 회원가입 view를 보여주는 페이지
		@RequestMapping("/registerTeacherStart.do")
		private String registerTeacherStart() throws SQLException {
			System.out.println("registerTeacherStart");
			return "teacher.member";
		}
		// casting : teacher와 student에서 teacher로 분류, teacher_Register.jsp에서 넘어오는 페이지
		@RequestMapping("/castingTeacher.do")
		private String castingTeacher(TeacherVO tvo) throws SQLException, IllegalStateException, IOException {
			System.out.println("controller 준비");
			MultipartFile mFile=tvo.getUploadfile();
			System.out.println(tvo+"upload준비");
			if(mFile!=null&&mFile.isEmpty()==false){
			tvo.setOriginalfilename(mFile.getOriginalFilename());
			System.out.println("123 :"+tvo.getOriginalfilename());
			String uploadName=System.currentTimeMillis()+" "+tvo.getOriginalfilename();
			System.out.println(tvo+"originalfilename");
			tvo.setSavefilename(uploadName);
			System.out.println("123 :"+tvo.getSavefilename());
			System.out.println(uploadName+"왜안돼");
			File copyFile=new File(path+uploadName);
			mFile.transferTo(copyFile);
			}
			System.out.println("castingTeacher");
			registerMember(tvo);
			// teacherRegister_result.jsp 경로
			return "teacher.result";
		}
		// MemberService
		public void registerMember(MemberVO mvo) throws SQLException{	
			System.out.println(mvo+"1");
			memberService.registerMember(mvo);
			System.out.println(mvo+"2");
	}
		// 중복확인하는 메서드
		@RequestMapping("/isExistId.do")
		@ResponseBody
		public int isExistId(MemberVO mvo) throws SQLException{			
			System.out.println(mvo+"controller");
			int result=memberService.isExistId(mvo);
			System.out.println(result+": test2");
			return result;
		}
		
	/*	@RequestMapping("/upload.do")
		public int upload(TeacherVO tvo) throws SQLException, IllegalStateException, IOException{
			System.out.println("controller"+tvo);
			MultipartFile mFile=tvo.getUploadFile();
			if(mFile!=null&&mFile.isEmpty()==false){
			tvo.setOriginalfilename(mFile.getOriginalFilename());
			String uploadName=System.currentTimeMillis()+" "+tvo.getOriginalfilename();
			tvo.setSavefilename(uploadName);
			File copyFile=new File(path+uploadName);
			mFile.transferTo(copyFile);
			}
			int result=memberService.upload(tvo);
			return result;
		}*/
	//////////////////////////////////////////////////////////////////
	public String login(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("member login");
		return "login.member";
	}
	public String find(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("member find");
		return "find.member";
	}
	public String adminLogin(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("admin login");
		// tiles-def-member.xml : definition name="*/*.member
		// value="/member/{1}/{2}_form.jsp"
		return "admin/adminLogin.member";
	}
	public String adminUpdate(HttpServletRequest request, HttpServletResponse response) throws Exception{
		System.out.println("admin update");
		return "admin/adminUpdate.member";
	}

	/**
	 * profile
	 * 개인 정보를 가져오는 메서드 ..
	 * 마이페이지 서비스에서 사용을 한다.
	 * return profile.profile.mypage
	 * -> mypage\profile\profile_main.jsp
	 * @param request
	 * @param mvo
	 * @return
	 * @throws SQLException
	 */
	
	@RequestMapping("/profileTeacher.do")
	public String profileTeacher(HttpServletRequest request,MemberVO mvo) throws SQLException{
		MemberVO  rmvo =null;
		System.out.println(mvo);
		 if(mvo.getId()!=null){
			if(!mvo.getId().equals("")){
				rmvo=memberService.showMember(mvo);
			}
		 }
		
		//결과로 전송하는 회원 정보를 출력
		System.out.println("MemberController profile"+rmvo);
		//조회결과를 requestScope에 저장!
		request.setAttribute("mvo", rmvo);
		return "profile/profileTeacher.mypage";
	}
	@RequestMapping("/profileStudent.do")
	public String profileStudent(HttpServletRequest request,MemberVO mvo) throws SQLException{
		MemberVO  rmvo =null;
		System.out.println(mvo);
		 if(mvo.getId()!=null){
			if(!mvo.getId().equals("")){
				rmvo=memberService.showMember(mvo);
			}
		 }
		
		//결과로 전송하는 회원 정보를 출력
		System.out.println("MemberController profile"+rmvo);
		//조회결과를 requestScope에 저장!
		request.setAttribute("mvo", rmvo);
		return "profile/profileStudent.mypage";
	}
	
	/**
	 * 비밀번호 확인하는 페이지로 이동하는 메서드
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/moveConfirmPass.do")
	public String moveConfirmPass() throws SQLException{
		return "withdrawal/confrimPass.mypage";
	}
	
	/**
	 * ajax를 통해서 비밀번호를 체크하는 메서드
	 * @param mvo
	 * @param session
	 * @param path
	 * @return
	 */
	@RequestMapping("/confirmPass.do")
	@ResponseBody
	public boolean confirmPass(MemberVO mvo,HttpSession session,String path){
		boolean message =false;
		MemberVO rmvo =null;
		try {
			rmvo = memberService.login(mvo);
			
			// id와 password가 같은 회원이 있다면 true값을 넘겨준다.
			if(rmvo!=null){
				System.out.println("confirmPass complete");
				message=true;
			}			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return message;
	}
	
	/**
	 * 회원 탈퇴 버튼을 누르는 페이지로 이동하는 메서드
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/moveWithdrawal.do")
	public String moveWithdrawal() throws SQLException{
		return "withdrawal/withdrawal.mypage";
	}
	
	/**
	 * 회원 탈퇴를 담당하는 메서드
	 * 회원의 정보에 탈퇴일자를 기록하여 탈퇴여부를 결정한다.
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/withdrawalMember.do")
	public String withdrawalMember(HttpSession session,MemberVO mvo) throws SQLException{
		
		memberService.withdrawalMember(mvo);
		System.out.println("withdrawalMember");
		logout(session);
		System.out.println("withdrawalMember - logout");
		return "home";
	}
	/**
	 * updateMember
	 * 개인 정보를 수정하는 메서드 
	 * ver-1. 이름만 수정하는 메서드
	 * ver-2. 성별 수정기능 추가
	 */
	@RequestMapping("/updateMember.do")
	@ResponseBody
	public MemberVO updateMember(HttpServletRequest request,MemberVO mvo) throws SQLException{
		System.out.println("updateMember"+mvo);
		MemberVO  rmvo=memberService.updateMember(mvo);
		//결과로 전송하는 회원 정보를 출력
		System.out.println("MemberController updateMember"+rmvo);
		//조회결과를 requestScope에 저장!
		//request.setAttribute("mvo", rmvo);
		return rmvo;
	}
	
	/**
	 * updateTeacher, updateStudent
	 *  선생님과 학생이 구별되는 변수들을 수정한다.
	 */
	@RequestMapping("/updateTeacher.do")
	@ResponseBody
	public MemberVO updateTeacher(HttpServletRequest request,TeacherVO tvo) throws SQLException{
		System.out.println("updateTeacher"+tvo);
		MemberVO  rmvo=memberService.updateTeacher(tvo);
		//결과로 전송하는 회원 정보를 출력
		System.out.println("MemberController updatTeacher"+rmvo);
		//조회결과를 requestScope에 저장!
		//request.setAttribute("mvo", rmvo);
		return rmvo;
	}
	@RequestMapping("/updateStudent.do")
	@ResponseBody
	public MemberVO updateStudent(HttpServletRequest request,StudentVO svo) throws SQLException{
		System.out.println("updateStudent"+svo);
		MemberVO  rmvo=memberService.updateStudent(svo);
		//결과로 전송하는 회원 정보를 출력
		System.out.println("MemberController updatStudent"+rmvo);
		//조회결과를 requestScope에 저장!
		//request.setAttribute("mvo", rmvo);
		return rmvo;
	}
////////////////////////////////최정훈 시작~~~//////////////////////////////////////////////////////
////////////////////////////////로그인,로그아웃, 나의 문의내역////////////////////////////////////////////		
	/**
	 * 로그인 메서드 입니다.
	 * login_result에서 session을 체크해서
	 * session이 있을 경우 넘어 온다.
	 * 어느 시점에서 로그인을 시도하는지 알기 위해 
	 * path값으로 로그인 다음화면 경로를 저장한다.
	 * @param mvo
	 * @param request
	 * @param session
	 * @param path
	 * @return
	 * @throws SQLException 
	 */
	@RequestMapping("/login.do")
	public ModelAndView login(MemberVO mvo, HttpServletRequest request,
			HttpSession session,String path) throws SQLException {
			//회원의 정보를 lmvo에 담아 lmvo가 null이 아니면 session에 담는다.
			MemberVO rmvo = memberService.login(mvo);
			if (rmvo != null) {
				
				session.setAttribute("mvo", rmvo);
			}else if(rmvo==null){
				System.out.println("null 이어야?");
			//lmvo가 null이면 로그인 페이지로 넘어 간다.
				return new ModelAndView("member/loginResult.loginResult","path",path);
			}
		return new ModelAndView(path, "mvo", rmvo);
	}
	
	/**
	 * 로그아웃 메서드
	 * session이 null이 아니면 session를 종료시킨다.
	 * @param session
	 * @return
	 */
	@RequestMapping("/logout.do")
	public ModelAndView logout(HttpSession session) {
		if (session != null) {
			session.invalidate();
		}
		return new ModelAndView("home");
	}
	
	/**
	 * loginResult
	 * 로그인 체크과정이 없이 메인 페이지가 로그인폼으로 이루어져있는 페이지로 이동
	 * @param mvo
	 * @param session
	 * @return
	 */
	@RequestMapping("/loginResult.do")
	public ModelAndView loginResult(MemberVO mvo,HttpSession session,String path){
		return new ModelAndView("member/loginResult.loginResult","path",path);
	}
	
	@RequestMapping("/myHelp.do")
	public ModelAndView getHelpList(MyHelpVO myHelpVO) throws SQLException{
		return new ModelAndView("myHelp/myHelp.myhelp","list",memberService.myHelpList(myHelpVO));
	}
///////////////////////////////최정훈 끝~///////////////////////////////////////////////////////
	
	
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////정운선 시작//////////////////////////////////////////////	
/**
 * 학생찾기 첫페이지 보여주기
 * @param request
 * @param response
 * @return
 * @throws SQLException
 */
	@RequestMapping("/studentListBasic.do")
	public ModelAndView getStudentListBasic(HttpServletRequest request, HttpServletResponse response) throws SQLException{
		return new ModelAndView("student/basiclist.search");//tab 으로 변경하여 수정
	}
	
	
	/**
	 * 학생찾기 첫페이지 보여주기에서 셀렉트박스에 뿌려줄 희망과목리스트 가져오기
	 * 틀린예:리턴값을 ModelAndView로 넘기면 새로운 map을 생성해서 listVo를 저장한다.
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/hopeSubjectList.do")
	@ResponseBody
	public HashMap hopeSubjectList(HttpServletRequest request, HttpServletResponse response) throws Exception{
		List<CodeVO> listvoOfSido=memberService.sidoList();
		List<CodeVO> listVoOfHopesubject=memberService.hopeSubjectList();	//과외희망과목 : hopesubject
		List<CodeVO> listvoOfGender=memberService.genderList();	//성별 : gender
		List<CodeVO> listvoOfGrade=memberService.gradeList();	//학년 : grade
		List<CodeVO> listvoOfPassword=memberService.passwordList();	//비밀번호 : password
		HashMap map=new HashMap();
		map.put("hopeSubjectList", listVoOfHopesubject);
		map.put("genderList", listvoOfGender);
		map.put("gradeList", listvoOfGrade);
		map.put("sidoList", listvoOfSido);	
		map.put("passwordList", listvoOfPassword);
		System.out.println(map);
		return map;
	}

	/**
	 * 학생찾기 첫페이지 보여주기에서 셀렉트박스에 뿌려줄 시도리스트 가져오기
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/getSidoList.do")
	@ResponseBody
	public List<CodeVO> getSidoList(HttpServletRequest request, HttpServletResponse response) throws Exception{
		List<CodeVO> listVO=memberService.sidoList();
		System.out.println("controller getSidoList"+listVO);
		return listVO;
	}
	
	/**
	 * 이름과 이메일로 아이디를 찾아온다.
	 * @param mvo
	 * @return
	 * @throws SQLException
	 */
	
	/**
	 * 학생찾기 첫페이지 보여주기에서 셀렉트박스에 뿌려줄 희망과목리스트 가져오기
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/gugunList.do")
	@ResponseBody
	public List<CodeVO> gugunList(HttpServletRequest request, HttpServletResponse response, String code_code) throws Exception{
		List<CodeVO> listvoOfGugun=memberService.gugunList(code_code);
		return listvoOfGugun;
	}
	
	/**
	 * 과외학생찾기페이지에서 tap-전체보기를 처리하는 method
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/tabTotalView.do")
	public ModelAndView tabTotalView(HttpServletRequest request, HttpServletResponse response, String pageNo) throws Exception{
		StudentListVO listVO=memberService.getStudentListBasic(pageNo);
		return new ModelAndView("search/students/tabpage/total_form","listVO",listVO);
	}

	/**
	 * 과외학생찾기페이지에서 tap-지역별를 처리하는 method
	 * @param request
	 * @param response
	 * @param pageNo
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/tabRegionView.do")
	public ModelAndView tabRegionView(HttpServletRequest request, HttpServletResponse response, String pageNo) throws Exception{
//		StudentListVO listVO=memberService.getRegionList(pageNo);
		StudentListVO listVO=memberService.getStudentListBasic(pageNo);
		return new ModelAndView("search/students/tabpage/region_form","listVO",listVO);
	}	//redirect:
	/**
	 * 과외학생찾기페이지에서 tap-과목별를 처리하는 method
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/tabSubjectView.do")
	public ModelAndView tabSubjectView(HttpServletRequest request, HttpServletResponse response, String pageNo) throws Exception{
		StudentListVO listVO=memberService.getSubjectList(pageNo);
		return new ModelAndView("search/students/tabpage/subject_form","listVO", listVO);
	}
	/**
	 * 과외학생찾기페이지에서 tap-학년별를 처리하는 method
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/tabGradeView.do")
	public ModelAndView tabGradeView(HttpServletRequest request, HttpServletResponse response, String pageNo) throws Exception{
		StudentListVO listVO=memberService.getGradeList(pageNo);		
		return new ModelAndView("search/students/tabpage/grade_form","listVO", listVO);
	}

	/**
	 * 학생찾기-학년별(grade_form)의 검색창에서 학년과 이름을 받아서 검색하는 메서드 
	 * @param request
	 * @param response
	 * @param name
	 * @param grade
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/getSearchStudentbyGrade.do")
	@ResponseBody
	public StudentListVO getSearchStudentbyGrade(HttpServletRequest request, HttpServletResponse response, String grade_name, String grade_grade) throws Exception{
		MemberSearchVO memberSearchVO=new MemberSearchVO();	
		if(grade_name!=""){		//입력받은 이름은 null 일 경우도 있으므로 
			memberSearchVO.setName(grade_name);
		}		
		memberSearchVO.setGrade(grade_grade);
		StudentListVO listVO=memberService.getSearchStudentbyGrade(memberSearchVO);
		return listVO;
	}	

	

	/**
	 * 이름과 이메일로 아이디를 찾아온다.
	 * @param mvo
	 * @return
	 * @throws SQLException
	 */


/////////////////////////////////////정운선 끝///////////////////////////////////////	
	@RequestMapping("/findIdByNameEmail.do")
	public ModelAndView findIdByNameEmail(MemberVO mvo) throws SQLException{
		System.out.println("아이디 찾기:"+mvo);
		String id=memberService.findIdByNameEmail(mvo);
		System.out.println("controller id:"+id);
		return new ModelAndView("support/inquiry/findIdResultPage.inquiry","id",id);
	}
	/**
	 * 아이디와 이메일로 패스워드의 질문을 찾아온다.
	 * @param mvo
	 * @return
	 * @throws SQLException
	 */
	@RequestMapping("/findQPassByIdEmail.do")
	public ModelAndView findQPassByIdEmail(MemberVO mvo) throws SQLException{
		System.out.println("패스워드 질문 찾기:"+mvo);
		MemberVO mvo1=memberService.findQPassByIdEmail(mvo);
		mvo1.setId(mvo.getId());
		System.out.println("controller questionPass:"+mvo1);
		return new ModelAndView("support/inquiry/findQPassResultPage.inquiry","mvo",mvo1);
	}
	@RequestMapping("/findPasswordByQnAPass.do")
	@ResponseBody
	public String findPasswordByQnAPass(MemberVO mvo) throws SQLException{
		System.out.println("패스워드 찾기 입력값"+mvo);
		String password=memberService.findPasswordByQnAPass(mvo);
		String result="등록된 패스워드는 "+password+" 입니다.";
		if(password==null){
			result="입력값이 일치하지 않습니다.";
		}
		return result;
	}
}
